home *** CD-ROM | disk | FTP | other *** search
- /* Variant of s_cat that allows the target of a concatenation to */
- /* appear on its right-hand side (contrary to the Fortran 77 Standard). */
-
- #include "f2c.h"
- #undef abs
- #ifdef KR_headers
- extern char *malloc();
- extern void free();
- #else
- #include "stdlib.h"
- #endif
- #include "string.h"
-
- static VOID
- #ifdef KR_headers
- s_cat0(lp, rpp, rnp, n, ll) char *lp, *rpp[]; ftnlen rnp[], n, ll;
- #else
- s_cat0(char *lp, char *rpp[], ftnlen rnp[], ftnlen n, ftnlen ll)
- #endif
- {
- ftnlen i, nc;
- char *rp;
-
- for(i = 0 ; i < n ; ++i) {
- nc = ll;
- if(rnp[i] < nc)
- nc = rnp[i];
- ll -= nc;
- rp = rpp[i];
- while(--nc >= 0)
- *lp++ = *rp++;
- }
- while(--ll >= 0)
- *lp++ = ' ';
- }
-
- VOID
- #ifdef KR_headers
- s_cat(lp, rpp, rnp, np, ll) char *lp, *rpp[]; ftnlen rnp[], *np, ll;
- #else
- s_cat(char *lp, char *rpp[], ftnlen rnp[], ftnlen *np, ftnlen ll)
- #endif
- {
- ftnlen i, L, m, n;
- char *lpe, *rp;
-
- n = *np;
- lpe = lp;
- L = ll;
- i = 0;
- while(i < n) {
- rp = rpp[i];
- m = rnp[i++];
- if (rp >= lpe || rp + m <= lp) {
- if ((L -= m) <= 0) {
- n = i;
- break;
- }
- lpe += m;
- continue;
- }
- lpe = malloc(ll);
- s_cat0(lpe, rpp, rnp, n, ll);
- memcpy(lp, lpe, ll);
- free(lpe);
- return;
- }
- s_cat0(lp, rpp, rnp, n, ll);
- }
-